

package Controlador;

import Modelo.InfoJornada;
import Modelo.Listas;
import Modelo.Validaciones;
import Modelo.Vigilantes;
import Vista.JFrameTurnos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

public class ControladorTurnos implements ActionListener
{
    private JFrameTurnos formTurnos;
    private Listas Lis;
    String fecha = Validaciones.getFechaActual();
    Date auxFechaMenor =Validaciones.CnvStringFecha(fecha);
    Date auxFechaMayor = Validaciones.CnvStringFecha("01/01/1970");
    
    public ControladorTurnos(Listas LisEmpresa) 
    {
      Lis=LisEmpresa;  
      formTurnos=new JFrameTurnos();
      formTurnos.agregarListener(this);
      formTurnos.setVisible(true);
    }  

    @SuppressWarnings("")
    
    public void AsignarFechas()
    {
        int Dias=0;
        Vigilantes vigi= new Vigilantes();
        
        for (int PosiContrato = 0; PosiContrato < Lis.getListaContrato().size(); PosiContrato++) // Buscar limites de fechas
        {
            Date fechaInicio = Lis.getListaContrato().get(PosiContrato).getFechaInicio();
            Date fechaFinal = Lis.getListaContrato().get(PosiContrato).getFechaFinal();

            auxFechaMenor = Validaciones.buscarFechaMenor(fechaInicio, auxFechaMenor);
            auxFechaMayor = Validaciones.buscarFechaMayor(fechaFinal, auxFechaMayor);
            
            Dias = Validaciones.diferenciaDeFechas(auxFechaMenor, auxFechaMayor);
            Lis.CargarJornada(Dias);
        }
        
        for(int i=0; i < Lis.getListaVigilantes().size();i++) //llenar fechas
        {
            vigi = Lis.getListaVigilantes().get(i);
            for(int m=0;m<=Dias;m++)
            {
                Date fechaAvance = Validaciones.sumarFechasDias(auxFechaMenor, m);
                vigi.getSuHorario().getListaHorarioVigilante().get(m).setFechaTurno(fechaAvance);
                //System.out.println("Fecha"+vigi.getSuHorario().getListaHorarioVigilante().get(m).getFechaTurno());
            }
        }
    }
        
    public void GenerarDiasLibres()
    {
            
        Vigilantes vigi= new Vigilantes();
        
        AsignarFechas();
        int Dias = Validaciones.diferenciaDeFechas(auxFechaMenor, auxFechaMayor);
        //System.out.println(Dias);
        
        for(int i=0; i < Lis.getListaVigilantes().size();i++)
        {
            vigi = Lis.getListaVigilantes().get(i);
            System.out.println("Vigilante Nro: "+ i);
            int auxDias = (Dias/7);
            
            int k =0;
            int l = 7;
            for(int j = 1; j < auxDias+1; j++) //Lleno semanas
            {   

                int libre1=(int)Math.floor(Math.random()*(7)+k);
                int libre2=(int)Math.floor(Math.random()*(7)+k);

                if(libre1 == libre2)
                    do
                    {
                        libre2=(int)Math.floor(Math.random()*(7)+k);
                    }
                    while(libre2 == libre1);

                vigi.getSuHorario().getListaHorarioVigilante().get(libre1).setLibre(true);
                vigi.getSuHorario().getListaHorarioVigilante().get(libre1).setDiaAsignado(false);
                System.out.println("Libre 1: "+vigi.getSuHorario().getListaHorarioVigilante().get(libre1).getFechaTurno());
                vigi.getSuHorario().getListaHorarioVigilante().get(libre2).setLibre(true);
                vigi.getSuHorario().getListaHorarioVigilante().get(libre2).setDiaAsignado(false);
                System.out.println("Libre 2: "+vigi.getSuHorario().getListaHorarioVigilante().get(libre2).getFechaTurno());

                System.out.println("----------------------");
                k = j*7;
                l = k+7;
            } 
            System.out.println("************************");
        }
    }
    
    public void Generar()
    {
        Vigilantes vigi= new Vigilantes();
        
        int PosiContrato;
        int tamannoContra = Lis.getListaContrato().size();
        int nroVigi = Lis.getListaVigilantes().size();
        int alealeatorioVigi;
        char D='D';
        char N='N';
        boolean tur=true;

        
        for(PosiContrato=0; PosiContrato <  tamannoContra ;PosiContrato++)//Lote de contratos
        {
            
            Date fechaInicio = Lis.getListaContrato().get(PosiContrato).getFechaInicio();
            Date fechaFinal = Lis.getListaContrato().get(PosiContrato).getFechaFinal();
            int auxDias = Validaciones.diferenciaDeFechas(fechaInicio, fechaFinal);
            
            //System.out.println("Contrato Nro: "+PosiContrato);
            
            String nroContrato = Lis.getListaContrato().get(PosiContrato).getNroContrato();
            int cantidad = Integer.parseInt(Lis.getListaContrato().get(PosiContrato).getCantidadVigilantes());
            
            String tip = Lis.getListaContrato().get(PosiContrato).getTipoCliente();
            String str2= "Tienda";
            
           
            for (int Dias = 0; Dias < auxDias; Dias++) //Por fechas
            {   
                //System.out.println(auxDias);

                for(int aux=0; aux < cantidad; aux++) //Selecciono los vigilantes hasta que este llenar la cantidad
                {
                    alealeatorioVigi = Validaciones.Generar_Aleatorio(nroVigi);
                    vigi = Lis.getListaVigilantes().get(alealeatorioVigi);
                   
                    if(VerificarVigilante(Dias, alealeatorioVigi))
                    {
                        vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setDiaAsignado(false); //Dia Laborable para el Vigi
                        vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setContrato(nroContrato);

                        if (tip.equalsIgnoreCase(str2))//Asignar Turno
                        {
                            vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(D);
                        }
                        else
                        {
                            if(tur)
                            {
                                vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(D);
                                tur=false;
                            }
                            else
                            {
                                vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(N);
                                tur=true;
                            }
                        }        
                        //System.out.println("vigilante asignado: " +vigi.getCedula());
                        //System.out.println("Turno: " +vigi.getSuHorario().getListaHorarioVigilante().get(Dias).getTurno());
                    }
                    else // Vigi estaba Libre o asignado
                    {
                        do
                        {
                            alealeatorioVigi = Validaciones.Generar_Aleatorio(nroVigi);
                            VerificarVigilante(Dias, alealeatorioVigi);
                        }
                        while(VerificarVigilante(Dias, alealeatorioVigi) == false);
                        
                        vigi = Lis.getListaVigilantes().get(alealeatorioVigi);
                        vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setDiaAsignado(false); //Dia Laborable para el Vigi
                        vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setContrato(nroContrato);
                        
                        if(tip.equalsIgnoreCase(str2))
                            vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(D);
                        else
                        {
                            if(tur)
                            {
                                vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(D);
                                tur=false;
                            }
                            else
                            {
                                vigi.getSuHorario().getListaHorarioVigilante().get(Dias).setTurno(N);
                                tur=true;
                            }
                        } 
                        //System.out.println("vigilante asignado: "+vigi.getCedula());
                        //System.out.println("Turno: " +vigi.getSuHorario().getListaHorarioVigilante().get(Dias).getTurno());
                    }
                }
            }
            System.out.println("************************");
        }
    }
    
    public void GenerarFaltas()
    {
        int falta1,falta2,falta3;
        int vigiFalta1,vigiFalta2,vigiFalta3;
        Vigilantes vigi= new Vigilantes();
        InfoJornada jornada=new InfoJornada();
        int nroVigi = Lis.getListaVigilantes().size();
        AsignarFechas();
                     
        int k =0;  
        
        int Dias = Validaciones.diferenciaDeFechas(auxFechaMenor, auxFechaMayor);
        
        for(int i=1; i <4;i++)
        {
            //vigi = Lis.getListaVigilantes().get(i);
            System.out.println("FALTAS: "+ "");

            falta1=0;
            falta2=0;
            falta3 =0;
            System.out.println("Faltas Semana: "+i);
            do
            {    
                vigiFalta1 = Validaciones.Generar_Aleatorio(nroVigi);
                falta1 = (int)Math.floor(Math.random()*(7)+k);
            }while (verificarFalta(vigiFalta1,falta1)==false); 
            Lis.getListaVigilantes().get(vigiFalta1).getSuHorario().getListaHorarioVigilante().get(falta1).setFalta(true);
            System.out.println("Fata 1: "+Lis.getListaVigilantes().get(vigiFalta1).getSuHorario().getListaHorarioVigilante().get(falta1).getFechaTurno());
            System.out.println("vigilante: "+ vigiFalta1); //Lis.getListaVigilantes().get(vigiFalta1).getCedula());
 
            do
            {
                vigiFalta2 = Validaciones.Generar_Aleatorio(nroVigi);
                falta2 = (int)Math.floor(Math.random()*(7)+k);
            }while (falta1==falta2 || vigiFalta2 == vigiFalta1 || verificarFalta(vigiFalta2,falta2)==false);
            Lis.getListaVigilantes().get(vigiFalta2).getSuHorario().getListaHorarioVigilante().get(falta2).setFalta(true);
            System.out.println("Fata 2: "+Lis.getListaVigilantes().get(vigiFalta2).getSuHorario().getListaHorarioVigilante().get(falta2).getFechaTurno());
            System.out.println("vigilante: "+vigiFalta2);//Lis.getListaVigilantes().get(vigiFalta2).getCedula());

            do
            {
                vigiFalta3 = Validaciones.Generar_Aleatorio(nroVigi);
                falta3 = (int)Math.floor(Math.random()*(7)+k);
            }while (falta3==falta1 || falta3==falta2 || vigiFalta3 == vigiFalta1 || vigiFalta3 == vigiFalta2 || verificarFalta(vigiFalta3,falta3)==false);              

            Lis.getListaVigilantes().get(vigiFalta3).getSuHorario().getListaHorarioVigilante().get(falta3).setFalta(true);
            System.out.println("Fata 3: "+Lis.getListaVigilantes().get(vigiFalta3).getSuHorario().getListaHorarioVigilante().get(falta3).getFechaTurno());
            System.out.println("vigilante: "+vigiFalta3);//Lis.getListaVigilantes().get(vigiFalta3).getCedula());
                
            k = i*7;   
            System.out.println("*************");
        }
        System.out.println("--------------");  
    } 

    
    
    
    public boolean verificarFalta(int vigiFalta, int diaFalta)
    {
        Vigilantes vigi= new Vigilantes();
        vigi = Lis.getListaVigilantes().get(vigiFalta);
        boolean veri=true;
        if(vigi.getSuHorario().getListaHorarioVigilante().get(diaFalta).getContrato().equalsIgnoreCase("No Asignado"))
            veri= false;
      
       return veri; 
    }
    
    public boolean VerificarVigilante(int Dias, int aleatorioVigi)
    {   
        Vigilantes vigi= new Vigilantes();
        
        vigi = Lis.getListaVigilantes().get(aleatorioVigi);
                    
        return !vigi.getSuHorario().getListaHorarioVigilante().get(Dias).getLibre() && vigi.getSuHorario().getListaHorarioVigilante().get(Dias).getDiaAsignado();
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource().equals(formTurnos.getBtnGenerarTurnos()))
        {
            GenerarDiasLibres();
            Generar();
            GenerarFaltas();
            formTurnos.getBtnGenerarTurnos().setEnabled(false);
            formTurnos.dispose();
        }
    }
}

